#ifndef PLATEAU_H
#define PLATEAU_H

#include <vector>
#include <map>
#include <iostream>

class Plateau
{
private:
    unsigned int _largeur ;                                      // La largeur du plateau de jeu
    unsigned int _hauteur ;                                      // La hauteur du plateau de jeu
    std::vector< std::vector< char > > _plateau ;       // Le plateau de jeu
    int _derniereColonneJouee ;                         // La dernière colonne jouée, cette variable est initialisée à -1 et est modifiée à chaque pion joué pour interdire sa suppréssion imédiate ou celle des pions identiques situés en dessous. Cette variable est réinitialisée à -1 en cas de suppression ou de rotation
public:
    Plateau(int largeur, int hauteur, bool load) ;
    void init(bool load) ;
    int getLargeur() ;
    int getHauteur() ;
    void affichage() ;
    void reinitialiser() ;
    void gravite() ;
    void appliquerGravite(int colonne) ;
    bool jouable(int colonne) ;
    bool jouer(int joueur, std::string nom) ;
    void jouer(int colonne, char pion) ;
    bool supprimable(int colonne, int ligne) ;
    bool supprimer(std::string nom) ;
    void supprimer(int colonne) ;
    void supprimer(int colonne, int ligne) ;
    bool tourner(std::string nom) ;
    void tournerDroite(bool ia = false) ;
    void tournerGauche(bool ia = false) ;
    char verif(int alignement) ;
    int verif(int alignement, int &alignementMax, char pion) ;
    int verifDiags(int alignement, int &alignmentMax, char pion) ;
    int verifDiagDroite(unsigned int colonne, unsigned int ligne, int alignement, int & alignementMax, char pion) ;
    int verifDiagGauche(unsigned int colonne, unsigned int ligne, int alignement, int &alignementMax, char pion) ;
    int scoreAlignement(int alignement) ;
    int nbPions(char pion) ;
    bool estPlein() ;
    bool casePleine(int colonne, int ligne) ;
    int pionLePlusHaut(int colonne) ;
    std::vector<int> evaluation(int profondeur, int difficulteIa, int alignement, char pion = 'O') ;
    //std::vector<int> evaluation2(int profondeur, int difficulteIa, int alignement, int & alpha, int & beta, char pion = 'O') ;
    int min(std::vector<int> eval) ;
    int max(std::vector<int> eval) ;
    int maxEval(std::vector<int> eval) ;
    int randVect(std::vector<int> eval) ;
    void jouerIa(std::vector<int> eval, int difficulteIa, int alignement) ;
    void supprimerIa(int choix) ;
    void sauvegarder() ;
};

#endif // PLATEAU_H
